<?php
/**
 * FTP操作类
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpFtp.php 1 2012-04-04 13:35:54Z Mo.yi $
 * @package web.helper
 * @since 1.0
 */

class dpFtp
{

    /**
     * FTP 连接 ID
     *
     * @var object
     */
    private $linkid;

    /**
     * 构造方法，连接FTP
     *
     * @param string $server
     * @param integer $port
     * @param string $username
     * @param string $password
     * @return boolean
     */
    public function __construct($server, $port = 21, $username, $password)
	{
        if (!$server || !$username || !$password) {
            return false;
        }

        $this->linkid = ftp_connect($server, $port) or die('FTP server connetc failed!');
        ftp_login($this->linkid, $username, $password) or die ('FTP server login failed!');

        //打开被动模拟
        ftp_pasv($this->linkid, 1);

        return true;
    }

    /**
     * FTP-文件上传
     *
     * @param string  $local_file 本地文件
     * @param string  $ftp_file Ftp文件
     * @return bool
     */
    public function upload($local_file, $ftp_file)
	{
        if (!$local_file || !$ftp_file) {
            return false;
        }

        $ftppath = dirname($ftp_file);
        if (!empty($ftppath)) {
            $this->makeDir($ftppath);
            @ftp_chdir($this->linkid, $ftppath);
            $ftp_file = '/'.basename($ftp_file).'/'.basename($local_file);
        }

        $ret = ftp_nb_put($this->linkid, $ftp_file, $local_file, FTP_BINARY);
        while($ret == FTP_MOREDATA) {
			$ret = ftp_nb_continue($this->linkid);
		}

        if ($ret != FTP_FINISHED) {
            return false;
        }
        return true;
    }

    /**
     * FTP-文件下载
     *
     * @param string  $local_file 本地文件
     * @param string  $ftp_file Ftp文件
     * @return bool
     */
    public function download($local_file, $ftp_file)
	{
        if (!$local_file || !$ftp_file) {
            return false;
        }

        $ret = ftp_nb_get($this->linkid, $local_file, $ftp_file, FTP_BINARY);
        while($ret == FTP_MOREDATA) {
               $ret = ftp_nb_continue ($this->linkid);
        }

        if ($ret != FTP_FINISHED) {
            return false;
        }

        return true;
    }

    /**
     * FTP-创建目录
     *
     * @param string  $path 路径地址
     * @return bool
     */
    public function makeDir($path) 
	{
		if (!$path) return false;

		$dir  = explode("/", $path);
		$path = ftp_pwd($this->linkid) . '/';
		$ret  = true;

		for ($i=0; $i<count($dir); $i++) {
			$path = $path . $dir[$i] . '/';
			if (!@ftp_chdir($this->linkid, $path)) {
				if (!@ftp_mkdir($this->linkid, $dir[$i])) {
					$ret = false;
					break;
				}
			}
			@ftp_chdir($this->linkid, $path);
		}

        if (!$ret) {
            return false;
        }
        return true;
    }

    /**
     * FTP-删除文件目录
     *
     * @param string  $dir 删除文件目录
     * @return bool
     */
    public function deleteDir($dir)
	{
        $dir = $this->checkPath($dir);
        if(@!ftp_rmdir($this->linkid, $dir)) {
            return false;
        }
        return true;
    }

    /**
     * FTP-删除文件
     *
     * @param string  $file 删除文件
     * @return bool
     */
    public function deleteFile($file)
	{
        $file = $this->checkPath($file);
        if(@!ftp_delete($this->linkid, $file)) {
            return false;
        }
        return true;
    }

    /**
     * FTP-FTP上的文件列表
     *
     * @param string $path 路径
     * @return bool
     */
    public function nlist($path = '/')
	{
        return ftp_nlist($this->linkid, $path);
    }

    /**
     * FTP-改变文件权限值
     *
     * @param string $file 文件
     * @param string $val  值
     * @return bool
     */
    public function chmod($file, $value = 0777)
	{
        return @ftp_chmod($this->linkid, $value, $file);
    }

    /**
     * FTP-返回文件大小
     *
     * @param string $file 文件
     * @return bool
     */
    public function fileSize($file)
	{
        return ftp_size($this->linkid, $file);
    }

    /**
     * FTP-文件修改时间
     *
     * @param string $file 文件
     * @return bool
     */
    public function mdtime($file)
	{
        return ftp_mdtm($this->linkid, $file);
    }

    /**
     * FTP-更改ftp上的文件名称
     *
     * @param string $oldname 旧文件
     * @param string $newname 新文件名称
     * @return bool
     */
    public function rename($oldname, $newname)
	{
        return ftp_rename($this->linkid, $oldname, $newname);
    }

    /**
     * 析构函数
     *
     * @return void
     */
    public function __destruct()
	{
        if ($this->linkid) ftp_close($this->linkid);
    }
}
